/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.model;

import java.io.Serializable;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Karine
 */
@SuppressWarnings("serial")
public class BancoDeClientes implements Serializable, Iterable<Cliente> {

	private List<Cliente> bancoDeClientes;

	public List<Cliente> getBancoDeClientes() {
		return bancoDeClientes;
	}
        
        public Cliente getCliente(int i) {
                Cliente cl = bancoDeClientes.get(i);
		return cl;
	}
        
	public BancoDeClientes() {
		bancoDeClientes = new ArrayList<Cliente>();
		Collections.sort(bancoDeClientes);
	}

	public BancoDeClientes(BancoDeClientes novoBanco) {
		bancoDeClientes = new ArrayList<Cliente>();
		bancoDeClientes.addAll(novoBanco.getBancoDeClientes());
		Collections.sort(bancoDeClientes);
	}
        
	public boolean inserirCliente(Cliente novoCliente) { // insere cliente na lista
		if (!contem(novoCliente)) {
			return bancoDeClientes.add(novoCliente);
		} else {
			return false;
		}
	}
	
	public boolean inserirClientes(BancoDeClientes clientes){
		return bancoDeClientes.addAll(clientes.bancoDeClientes);
	}

	public boolean clienteOff(Cliente pessoa) { //Busca cliente na lista de clientes e coloca como OFFline

		for (Cliente aux : bancoDeClientes) {
			if (aux.getEmail().equals(pessoa.getEmail())
					&& aux.getSenha().equals(pessoa.getSenha())) {
                                InetAddress endereco = null;
                                int porta = 0;
				Cliente novoCliente = new Cliente(aux.getNome(), aux.getEmail(), aux.getSenha(), endereco, porta);
				novoCliente.setStatus(TipoStatus.OFFLINE);
				bancoDeClientes.remove(aux);
				bancoDeClientes.add(novoCliente);
				pessoa.setStatus(TipoStatus.OFFLINE);
				return true;
			}
		}
		return false;
	}

	public boolean autentica(Cliente pessoa) { //Busca cliente na lista de clientes

		for (Cliente aux : bancoDeClientes) {
			if (aux.getEmail().equals(pessoa.getEmail())
					&& aux.getSenha().equals(pessoa.getSenha())) {
                               
				Cliente novoCliente = new Cliente(aux.getNome(), aux.getEmail(), aux.getSenha(), pessoa.getInetAddress(), pessoa.getPorta()); // Coloquei pessoa aqui, será?
				novoCliente.setStatus(TipoStatus.ONLINE);
				bancoDeClientes.remove(aux);
				bancoDeClientes.add(novoCliente);
				pessoa.setStatus(TipoStatus.ONLINE);
				return true;
			}
		}
		return false;
	}    

	public boolean excluirCliente(Cliente pessoa) { //Exclui cliente da lista de clientes

		for (Cliente aux : bancoDeClientes) {
			if (aux.getEmail().equals(pessoa.getEmail())
					&& aux.getSenha().equals(pessoa.getSenha())) {
				bancoDeClientes.remove(aux);

				return true;
			}
		}
		return false;
	}    

	public boolean excluirClientes(BancoDeClientes clientes) { //Exclui cliente da lista de clientes
		return bancoDeClientes.removeAll(clientes.bancoDeClientes);
	}

	public boolean contem(Cliente pessoa) { //Busca cliente na lista de clientes
		for (Cliente aux : bancoDeClientes) {
			if (aux.getEmail().equals(pessoa.getEmail())) {
				return true;
			}
		}
		return false;
	}
	
	public boolean setStatusCliente(Cliente cliente){
		for (Cliente aux : bancoDeClientes) {
			if (aux.getEmail().equals(cliente.getEmail())
					&& aux.getSenha().equals(cliente.getSenha())) {
				Cliente novoCliente = new Cliente(aux.getNome(), aux.getEmail(), aux.getSenha());
				novoCliente.setStatus(cliente.getStatus());
				bancoDeClientes.remove(aux);
				bancoDeClientes.add(novoCliente);
				return true;
			}
		}
		return false;
	}

	public Cliente getCliente(String email) {
		for (Cliente cliente : bancoDeClientes) {
			if (cliente.getEmail().equals(email)) {
				return cliente;
			}
		}
		return null;
	}

	@Override
	public Iterator<Cliente> iterator() {
		return bancoDeClientes.iterator();
	}

	public int size() {
		return bancoDeClientes.size();
	}
}
